package sanrenxing.course.dao.impl;

import sanrenxing.course.dao.CourseDao;
import sanrenxing.course.domain.Course;
import sanrenxing.course.domain.CourseName;
import sanrenxing.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Administrator
 * @date 2020/9/25 22:28
 * 编辑者：谭飞
 * 功能：
 */
public class CourseDaoImpl implements CourseDao {
    /**
     * 添加课程方法
     *
     * @param course 课程对象
     * @return 返回数据库执行有效行数
     */
    @Override
    public int add(Course course) {
        //定义数据库连接对象
        Connection conn=null;
        //定义编译对象
        PreparedStatement pstmt=null;
        //定义返回数据库执行有效行数
        int row=0;
        try {
            //实例化连接对象
            conn= JdbcUtils.getConnection();
            //定义sql语句
            String sql="insert into Course(courseName) values(?)";
            //实例化pstmt对象
            pstmt=conn.prepareStatement(sql);
            //对占位符赋值
            pstmt.setString(1,course.getCourseName());
            //使用预编译语句对象执行SQL语句，返回影响的行数
            row=pstmt.executeUpdate();

        } catch (SQLException e) {
            //抛出运行时异常
            new RuntimeException(e.getMessage(),e);
        }finally{
            //关闭，释放资源
            JdbcUtils.close(null,pstmt,conn);
        }
        //返回影响的行数
        return row;
    }

    /**
     * 删除课程方法
     *
     * @param courseId 课程id
     * @return 返回数据库执行有效行数
     */
    @Override
    public int delete(int courseId) {
        //定义数据库连接对象
        Connection conn=null;
        //定义预编译对象
        PreparedStatement pstmt=null;
        //使用预编译语句对象执行SQL语句，返回影响的行数
        int row=0;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //创建sql语句
            String sql="delete from Course where courseId=?";
            //实例化预编译对象
            pstmt=conn.prepareStatement(sql);
            //对占位符赋值
            pstmt.setInt(1,courseId);
            //执行语句
            row=pstmt.executeUpdate();
        } catch (SQLException e) {
            //抛出运行时异常
            new RuntimeException(e.getMessage(),e);
        }finally{
            //关闭，释放资源
            JdbcUtils.close(null,pstmt,conn);
        }
        //返回影响的行数
        return row;
    }

    /**
     * 修改课程方法
     *
     * @param course 课程对象
     * @return 返回数据库执行有效方法
     */
    @Override
    public int update(Course course) {
        //定义数据库连接对象
        Connection conn=null;
        //定义预编译对象
        PreparedStatement pstmt=null;
        //使用预编译语句对象执行SQL语句，返回影响的行数
        int row=0;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //创建sql语句
            String sql="update Course set courseName=? where courseId=?";
            //实例化预编译对象
            pstmt=conn.prepareStatement(sql);
            //给占位符赋值
            pstmt.setString(1,course.getCourseName());
            pstmt.setInt(2,course.getCourseId());
            row=pstmt.executeUpdate();
        } catch (SQLException e) {
            //抛出运行时异常
            new RuntimeException(e.getMessage(),e);
        }finally{
            //关闭，释放资源
            JdbcUtils.close(null,pstmt,conn);
        }
        //返回影响的行数
        return row;
    }

    /**
     * 获取查询行数方法
     *
     * @return 放回查询到的行数
     */
    @Override
    public int count() {
        //定义数据库连接对象
        Connection conn=null;
        //定义预编译对象
        PreparedStatement pstmt=null;
        //定义结果集对象
        ResultSet rs=null;
        int row=0;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //创建sql语句
            String sql="select count(*) as counts from Course";
            //实例化预编译对象
            pstmt=conn.prepareStatement(sql);
            //使用预编译语句对象执行SQL语句，返回结果集
            rs=pstmt.executeQuery();
            //判断结果集，并获得总行数
            if (rs.next()){
                //如果统计行数时没有指定别名，则用数字0作为参数
                row=rs.getInt("counts");
            }
        } catch (SQLException e) {
            //抛出运行时异常
            new RuntimeException(e.getMessage(),e);
        }finally{
            //关闭/释放资源
            JdbcUtils.close(rs,pstmt,conn);
        }
        //返回影响的行数
        return row;
    }

    /**
     * 查询显示一页的数据
     *
     * @param rows      一页行数
     * @param page      页数
     * @return 返回课程对象集合
     */
    @Override
    public List<Course> findByPage(int rows, int page) {
        //定义返回的员工对象集合
        List<Course> courseList=new ArrayList<>();
        //声明数据库连接对象
        Connection conn=null;
        //声明预编译语句对象
        PreparedStatement pstmt=null;
        //声明结果集对象
        ResultSet rs=null;
        try {
            //实例化数据库连接对象
            conn= JdbcUtils.getConnection();
            //编写SQL语句字符串
            String sql="select * from Course limit ?,?";
            //实例化预编译语句对象
            pstmt=conn.prepareStatement(sql);
            //给分页语句占位符赋值
            pstmt.setInt(1,(page-1)*rows);
            pstmt.setInt(2,rows);
            //使用预编译语句对象执行SQL语句，返回结果集
            rs=pstmt.executeQuery();
            //循环判断结果集，并把结果集的数据封装到员工对象中
            while(rs.next()){
                //定义课程对象
                Course course=new Course();
                //把结果集数据赋值给课程对象各属性
                course.setCourseId(rs.getInt("courseId"));
                course.setCourseName(rs.getString("courseName"));
                //把课程对象添加进课程集合中
                courseList.add(course);
            }
        } catch (SQLException e) {
            //抛出运行时异常
            new RuntimeException(e.getMessage(),e);
        }finally{
            //释放，关闭资源
            JdbcUtils.close(rs,pstmt,conn);
        }
        //返回课程对象集合
        return courseList;
    }


    /**
     * 查询所有班级名称
     *
     * @return
     */
    @Override
    public List<CourseName> findCourseName() {
        //声明数据库连接对象
        Connection conn=null;
        //声明预编译语句对象
        PreparedStatement pstmt=null;
        //声明结果集对象
        ResultSet rs=null;
        //定义返回的课程名称集合
        List<CourseName> courseNameList=new ArrayList<>();


        try {
            //实列化数据库连接对象
            conn= JdbcUtils.getConnection();
            //编写sql语句字符串
            String sql="select  courseName FROM course";
            //实例化预编译语句对象
            pstmt=conn.prepareStatement(sql);
            //使用预编译语句对象执行SQL语句，返回结果集
            rs=pstmt.executeQuery();
            //判断结果集，并获得总课程名称
            while (rs.next()){
                //定义课程名称对象
                CourseName courseName=new CourseName();
                //把结果集数据赋值课程名称
                courseName.setCourseName (rs.getString("courseName"));
                //添加课程名称对象到结果集中
                courseNameList.add(courseName);
            }

        } catch (SQLException e) {
            //抛出运行时异常
            throw new RuntimeException(e.getMessage(),e);
        }finally {
            //关闭/释放资源
            JdbcUtils.close(rs,pstmt,conn);
        }
        //返回课程名称对象集合
        return courseNameList;
    }
}
